<?php
class Dispatcher
{
	var $request;

	/**
	* Fonction principale du dispatcher
	* Charge le controller en fonction du routing
	**/
	function __construct()
	{
		session_start(); //demarrage de session (pour toutes les pages) 
		// Création d'un objet requête qui permet de récupérer l'url (toutes les informations demandées par l'utilisateur)
		$this->request = new Request(); 
		// Pas besoin d'initialisation de Routeur comme Request car c'est une classe statique
		Router::parse($this->request->url, $this->request);
		$action = $this->request->action;

		//Chargement du controller
		$controller = $this->loadController();

		// Environ 43'45 de la vidéo 2
		if(!in_array($this->request->action, array_diff(get_class_methods($controller), get_class_methods('Controller')) ))
		{
			$this->error('Le controller ' . $this->request->controller . ' n\'a pas de méthode ' .$this->request->action);
		}
		//Fonction pour appeler la fonction demandée dans l'url
		call_user_func_array(array($controller, $action), $this->request->params);

		$controller->render($action);
	}
	
	// Environ 28 minutes vidéo 2
	function loadController()
	{
		$name = ucfirst($this->request->controller).'Controller';
		
		if($name == 'Controller')//si racine du site -> redirection page d'accueil
		{
			header("location: ".BASE_URL."/index");
		}
		// Inclusion du controller
		$file = ROOT.DS.'controller'.DS.$name.'.php';
		require $file;
		
		$controller = new $name($this->request);
		return $controller;
	}

	/**
	* Fonction de gestion d'ereurs
	**/
	function error($message)
	{		
		$controller = new Controller($this->request);
		$controller->e404($message);
	}
}